package middlewareWeb;

import java.io.Serializable;
import java.util.Hashtable;

/**
 * Classe che modellizza l'oggetto contenuto in coda nel FE e nelle varie RM
 * @author jhonny
 */
public class InfoRM implements Serializable {
    private String componentId;
    private String operation;
    private TaskDescriptor task;
    private boolean ackReceived;
    private Address address;
    private Hashtable clocks;
    
    /**
    *Metodo costruttore
    */
    public InfoRM()
    {
        this.ackReceived=false;
    }
    /**
    *Metodo costruttore
     * @param id id del componente
     * @param op
     * @param task oggetto task descriptor
     * @param addr indirizzo del componente
    */
    public InfoRM(String id,String op,TaskDescriptor task,Address addr)
    {
        this.componentId = id;
        this.operation = op;
        this.task = task;
        this.address = addr;
        this.ackReceived = false;
        this.clocks = new Hashtable();
    }
/**
    *Metodo costruttore
     * @param id id del componente
     * @param op
     * @param task oggetto task descriptor
     * @param addr indirizzo del componente
     * @param c vector clock
    */
    public InfoRM(String id,String op,TaskDescriptor task,Address addr, Hashtable c)
    {
        this.componentId = id;
        this.operation = op;
        this.task = task;
        this.address = addr;
        this.ackReceived = false;
        this.clocks = c;
    }

     /**
    *Metodo che setta il valore della variabile ack
     * @param  value valore da assegnare
    */
    public void setAckReceived(boolean value)
    {
        this.ackReceived = value;
    }
    /**
    *Metodo che restituisce l'id del componente
     * @return id del componente
    */
    public String getComponentId()
    {
        return this.componentId;
    }
    /**
    *Metodo che restituisce l'operatione
     * @return stringa
    */
    public String getOperation()
    {
        return this.operation;
    }
    /**
    *Metodo che restituisce l'indirizzo del componente
     * @return oggetto di tipo Address
    */
    public Address getAddress(){
        return this.address;
    }
        /**
    *Metodo che restituisce il task
     * @return oggetto TaskDescriptor
    */
    public TaskDescriptor getTask()
    {
        return this.task;
    }
    /**
    *Metodo che restituisce il vector clock
    * @return hashTable vector clock
    */
    public Hashtable getClocks(){
        return this.clocks;
    }

        /**
    *Override del metodo toString per la classe InfoRM
     * @return stringa
    */
    @Override
    public String toString(){
        return "Componente: " + componentId + "Operazione: " + operation + "Task: " + task + "Ack: " + (ackReceived?"Ricevuto":"Non ricevuto");
    }
    /**
    *Override del metodo equals per la classe InfoRM
     * @param target
     * @return boolean per il buon esito
    */
    @Override
    public boolean equals(Object target)
    {
        //Aggiungere ulteriore controllo di univocità
        if (this.componentId.compareTo(((InfoRM)target).componentId)==0 && this.operation.compareTo(((InfoRM)target).operation)==0 && this.getTask().getID() == ((InfoRM)target).getTask().getID())
                return true;
        return false;
    }
}
